package com.hochschild.proveedores.action.seguridad;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.primefaces.component.menuitem.MenuItem;
import org.primefaces.component.submenu.Submenu;
import org.primefaces.model.DefaultMenuModel;
import org.primefaces.model.MenuModel;
import org.springframework.beans.factory.annotation.Autowired;

import com.haven.login.model.Account;
import com.hochschild.aplicacion.service.DataBaseManager;
import com.hochschild.fwk.constantes.Constantes;
import com.hochschild.proveedores.action.comun.BaseHome;
import com.hochschild.proveedores.domain.Catalogo;
import com.hochschild.seguridad.domain.OpcionAcciones;
import com.hochschild.seguridad.domain.PuestoPorUsuario;
import com.hochschild.seguridad.domain.PuestoPorUsuarioExterno;
import com.hochschild.seguridad.ldap.LdapSeguridad;
import com.hochschild.seguridad.local.domain.OpcionPantallaSistema;
import com.hochschild.seguridad.local.domain.OpcionSIO;
import com.hochschild.seguridad.local.domain.Usuario;
import com.hochschild.seguridad.local.domain.ValorOrganizacionalSesion;
import com.hochschild.seguridad.local.service.OpcionesSIOManager;
import com.hochschild.seguridad.service.OpcionesManager;
import com.hochschild.seguridad.service.OpcionesPantallaSistemaManager;
import com.hochschild.seguridad.service.PuestoPorUsuarioExternoManager;
import com.hochschild.seguridad.service.PuestoPorUsuarioManager;
import com.hochschild.seguridad.service.ValoresOrganizacionalesManager;

@ManagedBean(name="login123")
@SessionScoped
public class LoginMBean extends BaseHome<Account>{
	/**
	 * 
	 */
	private static final long serialVersionUID = 3546676750598372606L;
	public PuestoPorUsuarioExternoManager getPuestoPorUsuarioExternoManager() {
		return puestoPorUsuarioExternoManager;
	}




	public void setPuestoPorUsuarioExternoManager(
			PuestoPorUsuarioExternoManager puestoPorUsuarioExternoManager) {
		this.puestoPorUsuarioExternoManager = puestoPorUsuarioExternoManager;
	}


	private Usuario user;
	private MenuModel menu;
	
	@Autowired
    private DataBaseManager dataBaseManager;//SIO_TEST
	
	@ManagedProperty("#{simpleOpcionesManager}")
	private OpcionesManager simpleOpcionesManager;//HOC_SEGURIDAD
	
	@ManagedProperty("#{simpleOpcionesSIOManager}")
	private OpcionesSIOManager opcionesSIOManager;//SIO_TEST
	
	@ManagedProperty("#{simpleValoresOrganizacionalesManager}")
	private ValoresOrganizacionalesManager valoresOrganizacionalesManager;//SIO_TEST
	
	private LdapSeguridad ldapSeguridad = new LdapSeguridad();//LDAP
	
	@ManagedProperty("#{simpleOpcionesPantallaSistemaManager}")
	private OpcionesPantallaSistemaManager opcionesPantallaSistemaManager;

    private Logger logger = Logger.getLogger(LoginMBean.class);

    @Autowired
    private PuestoPorUsuarioManager puestoPorUsuarioManager;
    @Autowired
    private PuestoPorUsuarioExternoManager puestoPorUsuarioExternoManager;
    
	
    /*@Autowired
    private DecorarAplicacion data;*/
	
	public LoginMBean() {
		super();
		this.user = new Usuario();
		this.menu = new DefaultMenuModel();
		
	}
	
	
	
	
	public Usuario getUser() {
		return user;
	}




	public void setUser(Usuario user) {
		this.user = user;
	}

	


	public MenuModel getMenu() {
		return menu;
	}




	public void setMenu(MenuModel menu) {
		this.menu = menu;
	}




	public String autenticar() throws Exception{
		/*if(this.user.getName().equalsIgnoreCase("manuel")){
			throw new BusinessException("ENT_001_2");
		}
		this.mostrarMensajeInformacion("exelente el mensajito este");
		this.mostrarMensajeAdvertencia(ControlRecursosWeb.cargarMensaje("pe.gob.pcm.rufe.action.messages", "error_alfanumerico", "manuel"));
		return "login";*/
		//String versionBD = cargaVersionBD(request);
		String versionBD = "";
        //cargaImagenYColor(request, versionBD);
        
        //Boolean usuarioEnLDAP = ldapSeguridad.autenticaUsuario(username, password);        

        //ELIMINAR ESTA SECCION SE USA SOLO PARA QUE NO SE VAYA AL LDAP y DESCOMENTAR LA LINEA DONDE
        //SE LLAMA AL METODO autenticaUsuario
        Boolean usuarioEnLDAP = true;
        
        //Usuario usuario = new Usuario();
        
        if(usuarioEnLDAP) {
        	
        	cargaDatosUsuario(this.user.getNombre(), this.user);
        	logger.debug("evaluar si Usuario Tiene permiso");
           // if(!this.getUser().tienePermiso()){ 
            	logger.debug("Usuario Tiene permiso");
                
                HttpServletRequest request = 	(HttpServletRequest) this.getFacesContext().getExternalContext().getRequest();
                //session.setAttribute("session_usuario",usuario);
                HttpSession session = request.getSession();
                session.setAttribute("session_usuario",this.getUser());
            	getMenuPantalla(this.getUser());
            	this.mostrarMensajeInformacion(this.user.getNombre());
                return "main?faces-redirect=true";            
           // }
        }    
        
        //if(!usuarioEnLDAP || !this.getUser().tienePermiso() ){
        if(!usuarioEnLDAP){
        	//String mensaje = procesaMensaje(usuarioEnLDAP,this.getUser());
        	String mensaje = "abcdef";
            //request.setAttribute("strMsj",mensaje);
        	//this.mostrarMensajeAdvertencia(mensaje);
            return "login";
        }
        return null;
		
	}
	
	public void getMenuPantalla(Usuario user){
		
		
		MenuItem item = new MenuItem();
		Submenu submenu = new Submenu();  
        submenu.setLabel("Menu");  
        submenu.setIcon("ui-icon-extlink");
        
		for (OpcionSIO opcion: user.getLst_opciones()) {
		
	        item.setValue(opcion.getOpcion());  
	        item.setUrl(opcion.getLinkOpcion());  
	        submenu.getChildren().add(item);
	         
		}
		this.menu.addSubmenu(submenu);
		
//		 Submenu submenu = new Submenu();  
//	        submenu.setLabel("Dynamic Submenu 1");  
//	          
//	        MenuItem item = new MenuItem();  
//	        item.setValue("Dynamic Menuitem 1.1");  
//	        item.setUrl("#");  
//	        submenu.getChildren().add(item);  
//	          
//	        this.menu.addSubmenu(submenu);  
//	          
//	        //Second submenu  
//	        submenu = new Submenu();  
//	        submenu.setLabel("Dynamic Submenu 2");  
//	          
//	        item = new MenuItem();  
//	        item.setValue("Dynamic Menuitem 2.1");  
//	        item.setUrl("#");  
//	        submenu.getChildren().add(item);  
//	          
//	        item = new MenuItem();  
//	        item.setValue("Dynamic Menuitem 2.2");  
//	        item.setUrl("#");  
//	        submenu.getChildren().add(item);  
//	          
//	        this.menu.addSubmenu(submenu); 
		//return this.getUser().getLst_opciones();
	}
	
	private String procesaMensaje(Boolean usuarioEnLDAP, Usuario usuario) {
		String mensaje = "";
		
		if(!usuarioEnLDAP){
			mensaje="Verifique usuario y password.";
		}else if(!usuario.tienePermiso()){
			mensaje="Ud. no tiene acceso al sistema.";
		}
		
		return mensaje;
	}

	private void cargaDatosUsuario(String username, Usuario usuario) {
		
			this.getUser().setIdUsuario(username);
			//cargaOpciones(this.user);  
			//cargaValoresOrganizacionales(this.user, Constantes.TIPO_VALOR_ORGANIZACIONAL_SOCIEDAD);
			//cargaNombreCompleto(this.user);
		
	}

	private String cargaVersionBD(HttpServletRequest request) {
		String versionBD = dataBaseManager.getBDVersion();
        request.setAttribute("servidorBD",versionBD);
		return versionBD;
	}

	private void cargaNombreCompleto(Usuario usuario) {
		try {
			String nombre = getNombreCompletoUsuarioFromBDSeguridad(usuario);
			if(nombre != null && !nombre.equals("")){
			    usuario.setNombre(nombre);
			}
		} catch (NullPointerException e) {
			
			//No hace nada en este caso
		}
	}

	private String getNombreCompletoUsuarioFromBDSeguridad(Usuario usuario) throws NullPointerException {
		String nombre;
		String username = usuario.getIdUsuario();
		
		if(usuario.esUsuarioExterno()){
		    PuestoPorUsuarioExterno puestoPorUsuarioExterno = puestoPorUsuarioExternoManager.getPuestoPorUsuarioExterno(username);
		    nombre = puestoPorUsuarioExterno.getNombre();
			
		}else{                        
		    PuestoPorUsuario puestoPorUsuario = puestoPorUsuarioManager.getPuestoPorUsuario(username);
		    nombre = puestoPorUsuario.getNombreUsuario()+" "+puestoPorUsuario.getApellidoUsuario();;
		}
		
		return nombre;
	}

	private void cargaImagenYColor(HttpServletRequest request, String versionBD) {
		 
//        data.decoraAplicacion(versionBD);
//        request.setAttribute("imagenAMostrar",data.imagenAMostrar);
//        request.setAttribute("colorTop",data.colorTop);
	}

    private void cargaValoresOrganizacionales(Usuario beanUsr, String tipoValorOrganizacional) {
    	
    	String strLogin = beanUsr.getIdUsuario();
        List<ValorOrganizacionalSesion> lst_valoresOrganizacionales = valoresOrganizacionalesManager.getValores(Constantes.ID_APLICACION, strLogin, tipoValorOrganizacional);
       /* if (lst_valoresOrganizacionales != null && lst_valoresOrganizacionales.size() > 0) {
        	beanUsr.getLst_valoresOrganizacionales().addAll(lst_valoresOrganizacionales);
        }*/
    }

    private void cargaOpciones(Usuario beanUsr) {

    	String strLogin = beanUsr.getIdUsuario();
        List<Catalogo> lst_opciones = simpleOpcionesManager.getOpciones(Constantes.ID_APLICACION,strLogin);

        System.out.println("--> size "+lst_opciones.size());
        
       /* if(lst_opciones != null && lst_opciones.size() > 0){
            String strOpciones = opcionesSIOManager.cargaOpcionesMenu(lst_opciones, beanUsr);
            logger.debug(strOpciones);
            cargarOpcionesAccionesAutorizadas(beanUsr, strOpciones, lst_opciones);
        }*/
    }

    private void cargarOpcionesAccionesAutorizadas(Usuario usuario, String opciones, List<OpcionAcciones> listaOpciones){
        List<OpcionPantallaSistema> lst_opcionesAutorizadas = opcionesPantallaSistemaManager.getListaOpcionesSIO(opciones);
        this.getUser().setLst_opcionesSIOAutorizadas(lst_opcionesAutorizadas);

      // this.getUser().setLstOpcionesAutorizadas(listaOpciones);

    }


    public DataBaseManager getDataBaseManager() {
        return dataBaseManager;
    }

    public void setDataBaseManager(DataBaseManager dataBaseManager) {
        this.dataBaseManager = dataBaseManager;
    }

	public ValoresOrganizacionalesManager getValoresOrganizacionalesManager() {
        return valoresOrganizacionalesManager;
    }

    public void setValoresOrganizacionalesManager(ValoresOrganizacionalesManager valoresOrganizacionalesManager) {
        this.valoresOrganizacionalesManager = valoresOrganizacionalesManager;
    }

    public LdapSeguridad getLdapSeguridad() {
        return ldapSeguridad;
    }

    public void setLdapSeguridad(LdapSeguridad ldapSeguridad) {
        this.ldapSeguridad = ldapSeguridad;
    }

    public OpcionesPantallaSistemaManager getOpcionesPantallaSistemaManager() {
        return opcionesPantallaSistemaManager;
    }

    public void setOpcionesPantallaSistemaManager(OpcionesPantallaSistemaManager opcionesPantallaSistemaManager) {
        this.opcionesPantallaSistemaManager = opcionesPantallaSistemaManager;
    }

    public PuestoPorUsuarioManager getPuestoPorUsuarioManager() {
        return puestoPorUsuarioManager;
    }

    public void setPuestoPorUsuarioManager(PuestoPorUsuarioManager puestoPorUsuarioManager) {
        this.puestoPorUsuarioManager = puestoPorUsuarioManager;
    }


	public OpcionesManager getSimpleOpcionesManager() {
		return simpleOpcionesManager;
	}


	public void setSimpleOpcionesManager(OpcionesManager simpleOpcionesManager) {
		this.simpleOpcionesManager = simpleOpcionesManager;
	}


	public OpcionesSIOManager getOpcionesSIOManager() {
		return opcionesSIOManager;
	}


	public void setOpcionesSIOManager(OpcionesSIOManager opcionesSIOManager) {
		this.opcionesSIOManager = opcionesSIOManager;
	}
    
    
}
